    
    
/*---------------------------------------------------------
   Sets which stage a tool is at
---------------------------------------------------------*/
function ToolObj:UpdateData()
    
    self:SetStage( self:NumObjects() )
    
end
    
/*---------------------------------------------------------
   Sets which stage a tool is at
---------------------------------------------------------*/
function ToolObj:SetStage( i )
    
    if ( SERVER ) then
        self:GetWeapon():SetNWInt( "Stage", i, true )
    end
    
end

/*---------------------------------------------------------
   Gets which stage a tool is at
---------------------------------------------------------*/
function ToolObj:GetStage()
    return self:GetWeapon():GetNWInt( "Stage", 0 )
end

/*---------------------------------------------------------
   ClearObjects - clear the selected objects
---------------------------------------------------------*/
function ToolObj:ClearObjects()

    self:ReleaseGhostEntity()
    self.Objects = {}
    self:SetStage( 0 )
    
end


/*---------------------------------------------------------
    Since we're going to be expanding this a lot I've tried
    to add accessors for all of this crap to make it harder
    for us to mess everything up.
---------------------------------------------------------*/
function ToolObj:GetEnt( i )

    if (!self.Objects[i]) then return NULL end
    
    return self.Objects[i].Ent
end


/*---------------------------------------------------------
    Returns the world position of the numbered object hit
    We store it as a local vector then convert it to world
    That way even if the object moves it's still valid
---------------------------------------------------------*/
function ToolObj:GetPos( i )

    if (self.Objects[i].Ent:EntIndex() == 0) then
        return self.Objects[i].Pos
    else
        if (self.Objects[i].Phys ~= nil && self.Objects[i].Phys:IsValid()) then
            return self.Objects[i].Phys:LocalToWorld(self.Objects[i].Pos)
        else
            return self.Objects[i].Ent:LocalToWorld(self.Objects[i].Pos)
        end
    end
    
end

/*---------------------------------------------------------
    Returns the local position of the numbered hit
---------------------------------------------------------*/
function ToolObj:GetLocalPos( i )
    return self.Objects[i].Pos
end


/*---------------------------------------------------------
    Returns the physics bone number of the hit (ragdolls)
---------------------------------------------------------*/
function ToolObj:GetBone( i )
    return self.Objects[i].Bone
end

function ToolObj:GetNormal( i )
    if (self.Objects[i].Ent:EntIndex() == 0) then
        return self.Objects[i].Normal
    else
        local norm
        if (self.Objects[i].Phys ~= nil && self.Objects[i].Phys:IsValid()) then
            norm = self.Objects[i].Phys:LocalToWorld(self.Objects[i].Normal)
        else
            norm = self.Objects[i].Ent:LocalToWorld(self.Objects[i].Normal)
        end
        
        return norm - self:GetPos(i)
    end
end


/*---------------------------------------------------------
    Returns the physics object for the numbered hit
---------------------------------------------------------*/
function ToolObj:GetPhys( i )

    if (self.Objects[i].Phys == nil) then
        return self:GetEnt(i):GetPhysicsObject()
    end

    return self.Objects[i].Phys
end


/*---------------------------------------------------------
    Sets a selected object
---------------------------------------------------------*/
function ToolObj:SetObject( i, ent, pos, phys, bone, norm )

    self.Objects[i] = {}
    self.Objects[i].Ent = ent
    self.Objects[i].Phys = phys
    self.Objects[i].Bone = bone
    self.Objects[i].Normal = norm

    // Worldspawn is a special case
    if (ent:EntIndex() == 0) then

        self.Objects[i].Phys = nil
        self.Objects[i].Pos = pos
        
    else
        
        norm = norm + pos
    
        // Convert the position to a local position - so it's still valid when the object moves
        if (phys != nil && phys:IsValid()) then
            self.Objects[i].Normal = self.Objects[i].Phys:WorldToLocal(norm)
            self.Objects[i].Pos = self.Objects[i].Phys:WorldToLocal(pos)
        else
            self.Objects[i].Normal = self.Objects[i].Ent:WorldToLocal(norm)
            self.Objects[i].Pos = self.Objects[i].Ent:WorldToLocal(pos)
        end
        
    end
    
    if (SERVER) then
        // Todo: Make sure the client got the same info
    end
    
end


/*---------------------------------------------------------
    Returns the number of objects in the list
---------------------------------------------------------*/
function ToolObj:NumObjects()

    if ( CLIENT ) then
    
        return self:GetStage()
    
    end

    return #self.Objects
    
end